{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 从高维数据向低维数据的映射"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import matplotlib.pyplot as plt"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "X = np.empty((100, 2))\n",
    "X[:,0] = np.random.uniform(0., 100., size=100)\n",
    "X[:,1] = 0.75 * X[:,0] + 3. + np.random.normal(0, 10., size=100)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "PCA(n_components=2)"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "from playML.PCA import PCA\n",
    "\n",
    "pca = PCA(n_components=2)\n",
    "pca.fit(X)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[ 0.76676948,  0.64192256],\n",
       "       [-0.64191827,  0.76677307]])"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pca.components_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "PCA(n_components=1)"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pca = PCA(n_components=1)\n",
    "pca.fit(X)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "X_reduction = pca.transform(X)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(100, 1)"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_reduction.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "X_restore = pca.inverse_transform(X_reduction)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(100, 2)"
      ]
     },
     "execution_count": 9,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "X_restore.shape"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n0AAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x1140dcc88>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.scatter(X[:,0], X[:,1], color='b', alpha=0.5)\n",
    "plt.scatter(X_restore[:,0], X_restore[:,1], color='r', alpha=0.5)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### scikit-learn中的PCA"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from sklearn.decomposition import PCA"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "PCA(copy=True, iterated_power='auto', n_components=1, random_state=None,\n",
       "  svd_solver='auto', tol=0.0, whiten=False)"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pca = PCA(n_components=1)\n",
    "pca.fit(X)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([[-0.76676934, -0.64192272]])"
      ]
     },
     "execution_count": 13,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "pca.components_"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "X_reduction = pca.transform(X)\n",
    "X_restore = pca.inverse_transform(X_reduction)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\npwAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x119a30d68>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.scatter(X[:,0], X[:,1], color='b', alpha=0.5)\n",
    "plt.scatter(X_restore[:,0], X_restore[:,1], color='r', alpha=0.5)\n",
    "plt.show()"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.1"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
